"""
@-*- coding: utf-8 -*-
@ python：python 3.8
@ 创建人员：ylx
@ 创建时间：2025/4/29 上午10:07
@ 内容：封装yaml基础方法,extract.yaml 文件作为运行过程中，共享上下文数据记录的地方，比如说记录token，id等
读取/写入/清理，读取中又区分，比如说读取数据层的yaml文件，读取整体后，按照层级关系取值，第二种读取，直接读取yaml
文件中的某个值，这个值是为了在其他yaml文件中使用，都是读取，但是读取的颗粒度不一样，先读整体，返回一个整体的数据字典
然后取值，还是说定义一个方法，给对应的key，返回yaml文件中的某个值
"""
import yaml
from config.setting import file_path
import os
from datetime import datetime


def read_yaml(yaml_path):
    """
    读取yaml文件，目的是为了获取业务数据或者data层的yaml文件中的全部数据，来驱动逻辑层的执行
    拿到全部的数据字典后，根据我们对数据层yaml文件的格式，来取值，对应的驱动逻辑层执行
    :param yaml_path: yaml文件的路径
    :return:
    """
    # 编写习惯-先搭好架子，try-except
    try:
        with open(yaml_path, "r", encoding="utf-8") as file:
            data = yaml.safe_load(file)
            return data
    except UnicodeDecodeError:
        # 有的pycharm编辑器生成的yaml文件是 gbk 编码的，所以导致这个问题，Python默认使用UTF-8来解码
        print(f"{yaml_path}文件编码错误，尝试使用UTF-8去解码yaml文件发生错误")
    except yaml.YAMLError as e:
        print(f"Error,读取yaml文件失败，请检查格式-{yaml_path},原因：{e}")
    except Exception as e:
        print(f"读取{yaml_path}文件时出现异常，原因：{e}")


def write_yaml(value):
    """
    yaml文件数据写入,如将上下接口或上下文关联的共享数据写入yaml文件，如写入到extract.yaml文件
    :param value: 写入yaml文件的数据，必须为字典类型
    :return:
    """
    path = file_path["extract"]
    if not os.path.exists(path):
        with open(file_path, "w"):
            pass
    # print(path)
    try:
        # 追加写入模式
        with open(path, "a", encoding="utf-8") as file:
            if isinstance(value, dict):
                write_data = yaml.dump(value, allow_unicode=True, sort_keys=False)
                file.write(write_data)
            else:
                print("写入的数据类型必须为字典类型")
    except Exception as e:
        print(f"写入yaml文件异常，原因：{e}")
    finally:
        print("finished")


def clear_yaml():
    """
    清空extract.yaml文件内的数据
    :return:
    """
    with open(file_path["extract"], "w") as file:
        file.truncate()


def get_extract_yaml_single_data(node_name, sub_node_name=None):
    """
    单独获取yaml文件中的某个值

    用于获取extract.yaml文件的数据,比如说读取这个文件中的某个数据
    数据格式可能是简单的  key ： value 键值对
    也可能是 key:  key: value 这种嵌套的数据格式
    :param node_name: 第一级key值
    :param sub_node_name:第二级key值
    :return:
    """
    path = file_path["extract"]
    try:
        with open(path, "r", encoding="utf-8") as file:
            extract_data = yaml.safe_load(file)
            if sub_node_name is None:
                return extract_data[node_name]
            else:
                # dict.get(key, mo_ren_value) 使用字典的get方法尝试获取字典中键
                # 为key的对应的值，get方法接受2个参数，一个是你的目标key,第二个是可选参数
                # 如果找不到，将返回设置的默认值，下述写法，如果值不存在，则返回一个空字典
                # if 逻辑写的是字典取值的其中一种方法，下述写法是另一种方法
                return extract_data.get(node_name, {}).get(sub_node_name, {})

    except yaml.YAMLError as e:
        print(f"Error:读取yaml文件失败，请检查格式-{path},原因：{e}")
    except Exception as e:
        print(f"Error，未知异常，原因：{e}")


if __name__ == "__main__":
    content_1 = read_yaml("../data/armory_others.yaml")
    print(content_1)
    print("----")
    # print(content_1[1]["test_cases"][1]["input"]["command_4"]["update_armory_json_document"])
    # write_yaml({"key": "value"})
    # clear_yaml()
    today_time_1 = {"time": "_" + datetime.now().strftime("%Y%m%d_%H%M%S")}
    write_yaml(today_time_1)

